package com.muse.spi;

import java.util.Iterator;
import java.util.ServiceLoader;

import sun.misc.Service;

/**
 * SPI全称Service Provider Interface，是Java提供的一套用来被第三方实现或者扩展的接口，它可以用来启用框架扩展和替换组件。
 * SPI的作用就是为这些被扩展的API寻找服务实现。
 * 需要在resources目录下新建META-INF/services目录，并且在这个目录下新建一个与上述接口的全限定名一致的文件，
 * 然后，在这个文件中写入接口的实现类的全限定名。
 *
 * @author: muse
 **/
public class SpiTest {
    public static void main(String[] args) {
        System.out.println("-------------采用sun.misc.Service方式--------------");
        Iterator<SpiDemo> iterator = Service.providers(SpiDemo.class);
        execute(iterator);

        System.out.println("-------------采用java.util.ServiceLoader方式--------------");
        ServiceLoader<SpiDemo> serviceLoader = ServiceLoader.load(SpiDemo.class);
        execute(serviceLoader.iterator());
    }

    private static void execute(Iterator<SpiDemo> iterator) {
        SpiDemo spiDemo;
        while (iterator.hasNext()) {
            spiDemo = iterator.next();
            spiDemo.hello();
        }
    }
}

